/***********************************************************
     Definisce i tipi di terreno  e le mappe
***********************************************************/
:- use_module('types/syntax').
:- consult(geometry).
:- consult(io_map).
:- no_check(write_atom(_,_)).
:- no_check(cifra(_,_)).
%check_me :- ensure_loaded('types/chk'),
	load([geometry, io_map, mappe]).

% 1. Realizza i predicati richiesti dal modulo io_map.pl

%	una casella (X,Y) con simbolo di qualita' QS viene
%	rappresentata nel file mappa dal predicato
%	terreno(Q, p2(X,Y)), dove Q e' la qualita' di terreno
%	rappresentata dal carattere QS
save(QS,X,Y,File) :-
	map(QS,Q),
	write_atom(File, cella(Q,p(Y,X))).
	
%	le dimensioni DX e DY sono salvate nel predicato
%	dim(DX, DY)
save_dims(DX,DY,File) :-
	write_atom(File, dim(DX,DY)).
	
%	ausiiari

%posizioni nell'area della mappa
ok(p(X,Y)) :-
	dim(DY,DX),
	%((Y =:= 5)->writeln('Y ':Y:' DY ':DY);true),
	%writeln('Punto ':p(X,Y)),
	%writeln('Punto ':X:' ':Y),
	between(1,DX,X),
	%writeln('X del punto compreso tra 1 e ':DX),
	between(1,DY,Y).
	%writeln('Y del punto compreso tra 1 e ':DY).

%	scrive in F un fatto terminato da .
write_atom(F,A) :-
	writeq(F,A),
	write(F,'.'),
	nl(F).

%-------------------------------
%-------- SIMBOLI USATI --------
%------------------------------- 

dir_card(dir(1,0),0).  %NORD
dir_card(dir(-1,0),1). %SUD
dir_card(dir(0,-1),2). %OVEST
dir_card(dir(0,1),3).  %EST

map(p,pozzo).
map(w,wumpus).
map(s,safe).
map(t,tesoro).

perc(pozzo,b). %pozzo-brezza
perc(wumpus,f). %wumpus-fetore
perc(cadavere,n). %il cadavere del wumpus non puzza
perc(safe,n). %safe-niente
perc(tesoro,s). %tesoro-scintillio
perc(muro,u). %0=muro-urto

%	cifra(+C,-N) DET:   C e' una cifra decimale e
%                           N e' il suo valore numerico
cifra(C,N) :-
	catch(atom_number(C,N),
	    _E,
	    fail).

% 3. ------------------------------------------- I TESORI

tesori(Tesori) :-
	findall(P, cella(P,tesoro), Tesori).

/*****************************  VISUALIZZAZIONE MAPPA **************/

%	mostra sull'output corrente la mappa corrente
%       cioe' quella attualmente caricata
%       PRECONDIZIONE:  consult(Mappa) gia' eseguito
show_map :-
	dim(DY,DX),
	forall(between(1,DY,Y),
	       ( forall(between(1,DX,X), write_cella(X,Y)), nl )).


write_cella(X,Y) :-
	cella(QT,p(X,Y)),
	map(S,QT),
	write(S).